home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
131_01
/
a8080.c
< prev
next >
Wrap
Text File
|
1985-03-09
|
7KB
|
253 lines
/*
************************************************************
ACRL 8080 Code Generator
************************************************************
W. Lemiszki 9 Jan 1982
Filename: a8080.c BDS C v1.50
*/
#include "acrl.h"
#define iZOP 1 /* MACHINE types */
#define iREG 2
#define iREGL 3
#define iREGP 4
#define iIMM 5
#define iMVI 6
#define iLXI 7
#define iADR 8
#define iMOV 9
#define iXRP 10
/*
* Parse an 8080 instruction
* -------------------------
*/
instruction()
{
byte ty;
byte opcode;
ty = type; /* instruction type (above) */
opcode = value; /* unmodified opcode */
scan(); /* 1st operand token */
switch (ty)
{
case (iZOP): /* No operand instructions */
code(opcode);
break;
case (iREG): /* Register in bits 0-2 */
code(opcode + getreg(0));
break;
case (iREGL): /* Register in bits 3-5 */
code(opcode + getreg(1));
break;
case (iREGP): /* Register pair operand */
code(opcode + getreg(2));
break;
case (iIMM): /* 8 bit Immediate operand */
code(opcode);
code(expr8());
break;
case (iMVI): /* MVI instruction */
code(opcode + getreg(1));
eatcomma();
code(expr8());
break;
case (iLXI): /* LXI instruction */
code(opcode + getreg(2));
eatcomma();
codew(expr16());
break;
case (iADR): /* Address operand */
code(opcode);
codew(expr16());
break;
case (iMOV): /* MOV instruction */
opcode += getreg(1);
eatcomma();
code(opcode += getreg(0));
if (opcode == 0x76) /* hlt */
error ('R');
break;
case (iXRP): /* LDAX or STAX instruction */
code(opcode + getreg(3));
break;
}
}
/* Eat a comma */
eatcomma()
{
if (type != ',')
error('Q');
scan(); /* and scan next token */
}
/*
* Scan a register
* ---------------
* One of four actions based an arg:
* 0: return reg in bits 0-2
* 1: return reg in bits 3-5
* 2: return even reg in bits 3-5 (b,d,h,sp)
* 3: return b or d in bits 3-5
*/
byte getreg(arg)
byte arg;
{
byte reg;
if ((reg = expr8()) >= 8)
error('R');
switch (arg)
{
case 3:
if (reg & ~2)
error('R');
case 2:
if (reg & 1)
error('R');
case 1:
return (reg << 3);
case 0:
return (reg);
}
}
/*
* Define the Mnemonics
* --------------------
*/
init8080()
{
install(RESVD, "XCHG", MACHINE, iZOP, 0xEB);
install(RESVD, "DAA", MACHINE, iZOP, 0x27);
install(RESVD, "CMA", MACHINE, iZOP, 0x2F);
install(RESVD, "STC", MACHINE, iZOP, 0x37);
install(RESVD, "CMC", MACHINE, iZOP, 0x3F);
install(RESVD, "RLC", MACHINE, iZOP, 0x07);
install(RESVD, "RRC", MACHINE, iZOP, 0x0F);
install(RESVD, "RAL", MACHINE, iZOP, 0x17);
install(RESVD, "RAR", MACHINE, iZOP, 0x1F);
install(RESVD, "RET", MACHINE, iZOP, 0xC9);
install(RESVD, "RNZ", MACHINE, iZOP, 0xC0);
install(RESVD, "RZ", MACHINE, iZOP, 0xC8);
install(RESVD, "RNC", MACHINE, iZOP, 0xD0);
install(RESVD, "RC", MACHINE, iZOP, 0xD8);
install(RESVD, "RPO", MACHINE, iZOP, 0xE0);
install(RESVD, "RPE", MACHINE, iZOP, 0xE8);
install(RESVD, "RP", MACHINE, iZOP, 0xF0);
install(RESVD, "RM", MACHINE, iZOP, 0xF8);
install(RESVD, "XTHL", MACHINE, iZOP, 0xE3);
install(RESVD, "SPHL", MACHINE, iZOP, 0xF9);
install(RESVD, "PCHL", MACHINE, iZOP, 0xE9);
install(RESVD, "EI", MACHINE, iZOP, 0xFB);
install(RESVD, "DI", MACHINE, iZOP, 0xF3);
install(RESVD, "NOP", MACHINE, iZOP, 0x00);
install(RESVD, "HLT", MACHINE, iZOP, 0x76);
install(RESVD, "RIM", MACHINE, iZOP, 0x20);
install(RESVD, "SIM", MACHINE, iZOP, 0x30);
install(RESVD, "ADD", MACHINE, iREG, 0x80);
install(RESVD, "ADC", MACHINE, iREG, 0x88);
install(RESVD, "SUB", MACHINE, iREG, 0x90);
install(RESVD, "SBB", MACHINE, iREG, 0x98);
install(RESVD, "ANA", MACHINE, iREG, 0xA0);
install(RESVD, "XRA", MACHINE, iREG, 0xA8);
install(RESVD, "ORA", MACHINE, iREG, 0xB0);
install(RESVD, "CMP", MACHINE, iREG, 0xB8);
install(RESVD, "INR", MACHINE, iREGL, 0x04);
install(RESVD, "DCR", MACHINE, iREGL, 0x05);
install(RESVD, "RST", MACHINE, iREGL, 0xC7);
install(RESVD, "DAD", MACHINE, iREGP, 0x09);
install(RESVD, "INX", MACHINE, iREGP, 0x03);
install(RESVD, "DCX", MACHINE, iREGP, 0x0B);
install(RESVD, "PUSH", MACHINE, iREGP, 0xC5);
install(RESVD, "POP", MACHINE, iREGP, 0xC1);
install(RESVD, "ADI", MACHINE, iIMM, 0xC6);
install(RESVD, "ACI", MACHINE, iIMM, 0xCE);
install(RESVD, "SUI", MACHINE, iIMM, 0xD6);
install(RESVD, "SBI", MACHINE, iIMM, 0xDE);
install(RESVD, "ANI", MACHINE, iIMM, 0xE6);
install(RESVD, "XRI", MACHINE, iIMM, 0xEE);
install(RESVD, "ORI", MACHINE, iIMM, 0xF6);
install(RESVD, "CPI", MACHINE, iIMM, 0xFE);
install(RESVD, "IN", MACHINE, iIMM, 0xDB);
install(RESVD, "OUT", MACHINE, iIMM, 0xD3);
install(RESVD, "MVI", MACHINE, iMVI, 0x06);
install(RESVD, "LXI", MACHINE, iLXI, 0x01);
install(RESVD, "JMP", MACHINE, iADR, 0xC3);
install(RESVD, "JNZ", MACHINE, iADR, 0xC2);
install(RESVD, "JZ", MACHINE, iADR, 0xCA);
install(RESVD, "JNC", MACHINE, iADR, 0xD2);
install(RESVD, "JC", MACHINE, iADR, 0xDA);
install(RESVD, "JPO", MACHINE, iADR, 0xE2);
install(RESVD, "JPE", MACHINE, iADR, 0xEA);
install(RESVD, "JP", MACHINE, iADR, 0xF2);
install(RESVD, "JM", MACHINE, iADR, 0xFA);
install(RESVD, "CALL", MACHINE, iADR, 0xCD);
install(RESVD, "CNZ", MACHINE, iADR, 0xC4);
install(RESVD, "CZ", MACHINE, iADR, 0xCC);
install(RESVD, "CNC", MACHINE, iADR, 0xD4);
install(RESVD, "CC", MACHINE, iADR, 0xDC);
install(RESVD, "CPO", MACHINE, iADR, 0xE4);
install(RESVD, "CPE", MACHINE, iADR, 0xEC);
install(RESVD, "CP", MACHINE, iADR, 0xF4);
install(RESVD, "CM", MACHINE, iADR, 0xFC);
install(RESVD, "LDA", MACHINE, iADR, 0x3A);
install(RESVD, "STA", MACHINE, iADR, 0x32);
install(RESVD, "LHLD", MACHINE, iADR, 0x2A);
install(RESVD, "SHLD", MACHINE, iADR, 0x22);
install(RESVD, "MOV", MACHINE, iMOV, 0x40);
install(RESVD, "LDAX", MACHINE, iXRP, 0x0A);
install(RESVD, "STAX", MACHINE, iXRP, 0x02);
install(RESVD, "A", IDENT, idEQU, 7);
install(RESVD, "B", IDENT, idEQU, 0);
install(RESVD, "C", IDENT, idEQU, 1);
install(RESVD, "D", IDENT, idEQU, 2);
install(RESVD, "E", IDENT, idEQU, 3);
install(RESVD, "H", IDENT, idEQU, 4);
install(RESVD, "L", IDENT, idEQU, 5);
install(RESVD, "M", IDENT, idEQU, 6);
install(RESVD, "SP", IDENT, idEQU, 6);
install(RESVD, "PSW", IDENT, idEQU, 6);
}
/*EOF*/